package com.zenithmind.version.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.version.pojo.domain.Branch;
import com.zenithmind.version.pojo.dto.BranchCreateDTO;
import com.zenithmind.version.pojo.dto.BranchUpdateDTO;
import com.zenithmind.version.pojo.query.BranchQueryDTO;
import com.zenithmind.version.pojo.vo.BranchVO;

import java.util.List;

/**
 * 分支服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface BranchService extends IService<Branch> {

    /**
     * 创建分支
     * 
     * @param createDTO 创建信息
     * @return 分支信息
     */
    BranchVO createBranch(BranchCreateDTO createDTO);

    /**
     * 更新分支
     * 
     * @param id 分支ID
     * @param updateDTO 更新信息
     * @return 是否成功
     */
    Boolean updateBranch(String id, BranchUpdateDTO updateDTO);

    /**
     * 删除分支
     * 
     * @param id 分支ID
     * @return 是否成功
     */
    Boolean deleteBranch(String id);

    /**
     * 批量删除分支
     * 
     * @param ids 分支ID列表
     * @return 是否成功
     */
    Boolean batchDeleteBranches(List<String> ids);

    /**
     * 分页查询分支
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<BranchVO> getBranchPage(BranchQueryDTO queryDTO);

    /**
     * 获取分支详情
     * 
     * @param id 分支ID
     * @return 分支详情
     */
    BranchVO getBranchDetail(String id);

    /**
     * 获取仓库分支列表
     * 
     * @param repositoryId 仓库ID
     * @param includeDeleted 是否包含已删除的分支
     * @return 分支列表
     */
    List<BranchVO> getRepositoryBranches(String repositoryId, Boolean includeDeleted);

    /**
     * 根据名称获取分支
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @return 分支信息
     */
    BranchVO getBranchByName(String repositoryId, String branchName);

    /**
     * 获取默认分支
     * 
     * @param repositoryId 仓库ID
     * @return 默认分支
     */
    BranchVO getDefaultBranch(String repositoryId);

    /**
     * 设置默认分支
     * 
     * @param repositoryId 仓库ID
     * @param branchId 分支ID
     * @return 是否成功
     */
    Boolean setDefaultBranch(String repositoryId, String branchId);

    /**
     * 合并分支
     * 
     * @param repositoryId 仓库ID
     * @param sourceBranch 源分支
     * @param targetBranch 目标分支
     * @param userId 用户ID
     * @return 合并结果
     */
    Object mergeBranch(String repositoryId, String sourceBranch, String targetBranch, String userId);

    /**
     * 检查合并冲突
     * 
     * @param repositoryId 仓库ID
     * @param sourceBranch 源分支
     * @param targetBranch 目标分支
     * @return 冲突信息
     */
    Object checkMergeConflicts(String repositoryId, String sourceBranch, String targetBranch);

    /**
     * 比较分支差异
     * 
     * @param repositoryId 仓库ID
     * @param sourceBranch 源分支
     * @param targetBranch 目标分支
     * @return 差异信息
     */
    Object compareBranches(String repositoryId, String sourceBranch, String targetBranch);

    /**
     * 获取分支提交历史
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @param limit 限制数量
     * @return 提交历史
     */
    List<Object> getBranchCommits(String repositoryId, String branchName, Integer limit);

    /**
     * 搜索分支
     * 
     * @param repositoryId 仓库ID
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 分支列表
     */
    List<BranchVO> searchBranches(String repositoryId, String keyword, Integer limit);

    /**
     * 获取用户创建的分支
     * 
     * @param creatorId 创建者ID
     * @param repositoryId 仓库ID
     * @param limit 限制数量
     * @return 分支列表
     */
    List<BranchVO> getUserBranches(String creatorId, String repositoryId, Integer limit);

    /**
     * 获取活跃分支
     * 
     * @param repositoryId 仓库ID
     * @param limit 限制数量
     * @return 活跃分支列表
     */
    List<BranchVO> getActiveBranches(String repositoryId, Integer limit);

    /**
     * 获取分支统计信息
     * 
     * @param repositoryId 仓库ID
     * @return 统计信息
     */
    Object getBranchStatistics(String repositoryId);

    /**
     * 检查分支名称是否存在
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @param excludeId 排除的分支ID
     * @return 是否存在
     */
    Boolean checkBranchNameExists(String repositoryId, String branchName, String excludeId);

    /**
     * 保护分支
     * 
     * @param branchId 分支ID
     * @param isProtected 是否保护
     * @return 是否成功
     */
    Boolean protectBranch(String branchId, Boolean isProtected);

    /**
     * 归档分支
     * 
     * @param branchId 分支ID
     * @param isArchived 是否归档
     * @return 是否成功
     */
    Boolean archiveBranch(String branchId, Boolean isArchived);
}
